# 线性脚本
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
browser = webdriver.Chrome()
browser.maximize_window()
browser.get('https://www.baidu.com/')
# browser.implicitly_wait(15)
"""
隐式等待：
优点：
    开篇声明一次，后续的元素加载都会享受到等待时长。多余的时间不会继续等，会直接执行操作
    规定15s寻找，如果找不到则报错
缺点：
    它会把所有的元素加载出来，即使是你用不到的元素（图片、视频），js脚本
"""
# 输入4399
# browser.find_element(By.ID,"kw").send_keys('4399')
WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.ID,"kw"))).send_keys("4399")
"""
显示等待
WebDriverWait(browser,10,0.5)：显示等待关键字，第一个参数是驱动，第二个参数是等待的总时长，第三个参数是轮询频率
                                一共寻找了20次
优点：
    在规定的时间内，频繁的去寻找元素，找不到则报错
缺点：
    代码比较长
"""
# 点击搜索按钮
# browser.find_element(By.ID,"su").click()
WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.ID,"su"))).click()

# browser.find_element(By.CLASS_NAME,"tts-b-hl").click()
WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.CLASS_NAME,"tts-b-hl"))).click()

# 句柄切换
win = browser.window_handles
browser.switch_to.window(win[-1])

# browser.find_element(By.XPATH,"//*[@id='skinbody']/div[7]/div[1]/div[1]/div/span[7]/a").click()
WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.XPATH,"//*[@id='skinbody']/div[7]/div[1]/div[1]/div/span[7]/a"))).click()

win = browser.window_handles
browser.switch_to.window(win[-1])

# browser.find_element(By.XPATH,"//*[@id='skinbody']/div[6]/div[2]/div/ul/li[1]/a/b").click()
WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.XPATH,"//*[@id='skinbody']/div[6]/div[2]/div/ul/li[1]/a/b"))).click()

win = browser.window_handles
browser.switch_to.window(win[-1])

# browser.find_elements(By.CLASS_NAME,"btn")[1].click()
WebDriverWait(browser,10,0.5).until(EC.presence_of_all_elements_located((By.CLASS_NAME,"btn")))[1].click()

# 给大家看执行完的结果
time.sleep(5)
"""
报错的情况有哪些？
1、元素定位方式错误，找不到元素，报错
2、没有等待时间，页面元素还没有加载出来，报错-----加上强制等待 time.sleep()
"""

"""
三种等待
1、强制等待：代码执行到此，强制等待几秒
    time.sleep()
2、隐式等待：开篇声明一次，后续的元素加载都会享受到
    browser.implicitly_wait(15)
3、显示等待：给定总体时间秒数，频繁的去寻找元素
    WebDriverWait
"""
